<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    //方式一，常规写法，无法使用Symbol
    // class Person {
    //
    // }

    //表达式写法
    let Person = class {
        //构造方法，名称固定
        constructor(name, age) {
            this.name = name;
            this._age = age;
            this.hubby = ["java", "c++"];
            // let salary = Symbol("salary");
            // //定义一个私有的属性
            // this[salary] = 1000;
        }

        //不推荐，不同对象的函数地址不一致，会造成内存浪费
        say=function (){
            console.log(this.name);
        }

        sayHello() {
            console.log("hello");
        }

        //定义静态方法
        static t1() {
            //静态方法的this指向函数对象本身
            console.log("这是一个静态方法" + this.name + this._age);
        }

        //ageFunc属性的set方法，方法名称与操作的属性名称不能一致
        set age(age) {
            console.log("开始设置age的值");
            if (age <= 0) {
                console.log("年龄不可以低于0");
            } else if (age > 200) {
                console.log("这是人类的年龄吗？");
            } else {
                this._age = age;
            }
        }

        get age() {
            console.log("这是一个get方法");
            return this._age;
        }
        //在JS中get和set方法，是隐藏的，可以通过对象名.方法名调用，但是注意，该set和get方法操作的属性名不能与方法名一致。一般属性以_开头
    }

    let p1 = new Person("p1", 20);
    p1.hubby.push("Mysql");
    console.log(p1);
    let p2 = new Person("p2", 30);
    console.log(p2);
    console.log(p1.say === p2.say);
    console.log(p1.sayHello === p2.sayHello);
    p1.sayHello();
    p2.say();
    console.log(p1[p1.salary]);
    // p1.t1();
    Person.t1();
    p1.age = 100;
    console.log(p1.age);

    let Work = (function () {
        let salary = Symbol("salary");
        //表达式写法，可以使用Symbol来实现私有变量，也可以定义其它私有变量
        return class {
            constructor(name, age) {
                this.name = name;
                this.age = age;
                this[salary] = 1000;
            }

            info() {
                console.log(this[salary]);
            }
        };
    })();

    let w1 = new Work("w1", 30);
    console.log(w1);
    w1.info();
    let salary = Symbol("salary");
    console.log(w1[salary]);

    /*
    新建一个名为矩形Square的类，该类有两个int类型的私有实例变量分别表示高和宽，
    高和宽必须是整型数据，如果传入的是小数，则只取整数部分(用正则表达式实现)。
    还有一个名为getArea的方法。可通过getArea方法获取该矩形的面积。
    求高为15，宽为20的矩形的面积并打印
     */

    // let reg = /^(\d+)\.?\d+$/;
    let reg = /(\d+)(\.\d+)?/;
    // console.log("123.456".replace(reg, "$1.txt"));
    // console.log(reg.exec(123.456)[1.txt]);
    // console.log(reg.exec(123)[1.txt]);
    // console.log("123".match(reg));
    let Square = (function () {
        let sx = Symbol("x");
        let sy = Symbol("y");
        let reg = /(\d+)(\.\d+)?/;
        return class {
            constructor(x, y) {
                this[sx] = reg.exec(x)[1];
                this[sy] = reg.exec(y)[1];
            }

            getArea() {
                return this[sx] * this[sy];
            }

        }
    })();

    let s1 = new Square(10.1, 31.1234566);
    console.log(s1.getArea());

    class Rect extends Square {
        constructor(x, y) {
            console.log("Rect");
            super(x, y);
        }
    }

    console.log(new Rect(10, 10).getArea());;
</script>
</body>
</html>